package main

import (
	"bufio"
	"fmt"
	"net"
	"os"
	"strings"
)

// TCP/IP 传输控制协议

//OSI 参考模型(理论)
//物理层、数据链路层、网络层、传输层、会话层、表示层、应用层

// TCP/IP 模型(实现)
func main() {
	//去连接服务器（192.168.8.235:8888）
	conn, err := net.Dial("tcp", "127.0.0.1:8888")
	if err != nil {
		fmt.Println("客户端连接8888失败~")
		return
	}
	fmt.Println("我的地址是:", conn.RemoteAddr().String(), "连接成功！")

	defer func(dial net.Conn) {
		err := dial.Close()
		if err != nil {
			fmt.Println("客户端:", conn.RemoteAddr().String(), "关闭失败~")
			return
		}
	}(conn)

	reader := bufio.NewReader(os.Stdin) //os.Stdin 标准输入[终端]
	for {
		fmt.Printf("%s", "请输入:")
		line, err := reader.ReadString('\n')
		if err != nil {
			fmt.Printf("[%s]:%s \n", conn.RemoteAddr().String(), "读取终端输入失败~")
		} else {
			//发送数据到服务器
			_, err := conn.Write([]byte(line))
			if err != nil {
				fmt.Printf("[%s]:%s \n", conn.RemoteAddr().String(), "发送数据失败~")
			} else {
				if strings.Trim(line, "\r\n") == "exit" {
					fmt.Printf("[%s]:%s", conn.RemoteAddr().String(), "退出~")
					break
				}
				fmt.Printf("[%s]:%s", conn.RemoteAddr().String(), line)
			}
		}

		//接收服务器数据
		var buf []byte = make([]byte, 1024)
		n, err := conn.Read(buf)
		if err != nil {
			fmt.Printf("[%s]:%s \n", conn.RemoteAddr().String(), "接收数据异常")
		} else {
			fmt.Printf("[服务端]: %s\n", string(buf[:n]))
		}

	}

}
